home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 4.1 / ContextualMenus.st < prev    next >
Text File  |  1993-07-24  |  5KB  |  166 lines

  1. "    NAME        ContextualMenus
  2.     AUTHOR        Bernard Horan <bernard@is.morgan.com>
  3.     CONTRIBUTOR    Bernard Horan <bernard@is.morgan.com>
  4.     FUNCTION      disable menu items
  5.     ST-VERSIONS    4.1
  6.     PREREQUISITES     EmphasisedPopUpMenu
  7.     CONFLICTS     
  8.     DISTRIBUTION    global
  9.     VERSION        2.0
  10.     DATE        September 1991
  11.     SUMMARY        This category file-out contains two classes:
  12. ContextualMenu (a subclass of EmphasisedPopUpMenu) and
  13. ContextualMenuTracker (a subclass of MenuTracker).  Combined they
  14. provide menus with items which may appear greyed-out (or in different
  15. emphases).  The user is prohibited from selecting any of the greyed
  16. out items.  BH 25/9/92"
  17.  
  18. 'From Objectworks\Smalltalk(R), Release 4.1 of 15 April 1992 on 2 September 1992 at 4:27:12 am'!
  19.  
  20. MenuTracker subclass: #ContextualMenuTracker
  21.     instanceVariableNames: ''
  22.     classVariableNames: ''
  23.     poolDictionaries: ''
  24.     category: 'contextual menus'!
  25. ContextualMenuTracker comment:
  26. 'I provide modified functionaility for instances of the class ContextualMenu.  I only override two methods, 
  27. both of which are concerned with highlighting the menu selection.  I modify my supers'' behaviour by
  28. prohibiting the selkection of a disabled item.
  29.  
  30. Bernard Horan, 16 November 1992'!
  31.  
  32.  
  33. !ContextualMenuTracker methodsFor: 'marker adjustment'!
  34.  
  35. turnMarkerOff
  36.     "Make the marker invisible, if the item is enabled"
  37.  
  38.     self indexIsEnabled
  39.         ifTrue: 
  40.             [self
  41.                 hiliteRectangle: marker
  42.                 on: gc
  43.                 fColor: self foregroundColor
  44.                 bColor: self backgroundColor.
  45.             self
  46.                 displayExtraInformationFor: self markerIndex
  47.                 fColor: self foregroundColor
  48.                 bColor: self backgroundColor.
  49.             gc flush]!
  50.  
  51. turnMarkerOn
  52.     "Make the marker visible, if the item is enabled"
  53.  
  54.     self indexIsEnabled
  55.         ifTrue: 
  56.             [self
  57.                 hiliteRectangle: marker
  58.                 on: gc
  59.                 fColor: self selectionForegroundColor
  60.                 bColor: self selectionBackgroundColor.
  61.             self
  62.                 displayExtraInformationFor: self markerIndex
  63.                 fColor: self selectionForegroundColor
  64.                 bColor: self selectionBackgroundColor.
  65.             gc flush]! !
  66.  
  67. !ContextualMenuTracker methodsFor: 'private'!
  68.  
  69. indexIsEnabled
  70.     ^ menu fontKeys at: self markerIndex! !
  71.  
  72. EmphasisedPopUpMenu subclass: #ContextualMenu
  73.     instanceVariableNames: ''
  74.     classVariableNames: 'DisabledEmphasis EnabledEmphasis '
  75.     poolDictionaries: ''
  76.     category: 'contextual menus'!
  77. ContextualMenu comment:
  78. 'I re-use the instance variable fontKeys to indicate the state of enabledment (?) of each of my items, i.e. an array of
  79. Booleans.  Depending on whether an item is enabled, I display it in one of two emphases.  I have two class
  80. variables EnabledEmphasis and DisabledEmphasis which are emphasis sysmbols.  See class initialize for more information.
  81.  
  82. I rely on a different menuTracker, an instance of ContextualmenuTracker, which doesn''t allow a disbled item to be highlighted or selected.
  83.  
  84. Bernard Horan, 16 November 1992'!
  85.  
  86.  
  87. !ContextualMenu methodsFor: 'context'!
  88.  
  89. disableIndex: anIndex
  90.     self emphasize: false at: anIndex!
  91.  
  92. enableIndex: anIndex
  93.     self emphasize: true at: anIndex! !
  94.  
  95. !ContextualMenu methodsFor: 'private'!
  96.  
  97. defaultTracker
  98.  
  99.     ^ContextualMenuTracker for: self!
  100.  
  101. disabledEmphasis
  102.     ^DisabledEmphasis!
  103.  
  104. enabledEmphasis
  105.     ^EnabledEmphasis!
  106.  
  107. valueAtSelection
  108.     "Answer the item current selected."
  109.  
  110.     ((selection = 0 or: [selection > values size])
  111.         or: [(self fontKeys at: selection) not])
  112.         ifTrue: [^0].
  113.     ^values at: selection!
  114.  
  115. visualLabels
  116.     "Answer a TextList used to display the receiver."
  117.  
  118.     |   textArray |
  119.     textArray := OrderedCollection new.
  120.     labels with: self fontKeys do: [:label :fontKey |
  121.         textArray add: (Text string: label asString
  122.                 emphasis: (fontKey ifTrue:[self enabledEmphasis] ifFalse:[self disabledEmphasis])) ].
  123.     ^TextList new list: textArray style: self textAttributes! !
  124.  
  125. !ContextualMenu methodsFor: 'font accessing'!
  126.  
  127. fontKeys
  128.     "Answer the receiver's font key."
  129.  
  130.      fontKeys isNil ifTrue:[fontKeys := Array new: self labels size withAll: true].
  131.     ^ fontKeys! !
  132. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  133.  
  134. ContextualMenu class
  135.     instanceVariableNames: ''!
  136.  
  137.  
  138. !ContextualMenu class methodsFor: 'class initialization'!
  139.  
  140. initialize
  141.     "ContextualMenu initialize"
  142.     EnabledEmphasis := #default.
  143.     DisabledEmphasis := #strikeout
  144.     "The strikeout emphasis seems to work best for mono screens.  However here are a couple of alternatives:
  145.  
  146.     EnabledEmphasis := #bold.
  147.     DisabledEmphasis := #italic.
  148.  
  149. or
  150.  
  151.     EnabledEmphasis := #default.
  152.     DisabledEmphasis := Array with: #default with: #color->ColorValue lightGray"! !
  153.  
  154. !ContextualMenu class methodsFor: 'examples'!
  155.  
  156. example
  157.     "ContextualMenu example"
  158.  
  159.     | text menu |
  160.     text := 'abc\def\ghi' withCRs.
  161.     menu := self labels: text lines: #(1 ).
  162.     ^menu disableIndex: 2; startUp! !
  163. ContextualMenu initialize!
  164.  
  165.  
  166.